{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#faiss安装\n",
    "##使用Anaconda安装\n",
    "使用Anaconda安装使用faiss是最方便快速的方式，facebook会及时推出faiss的新版本conda安装包，在conda安装时会自行安装所需的libgcc, mkl, numpy模块。  \n",
    "faiss的cpu版本目前仅支持Linux和MacOS操作系统，gpu版本提供可在Linux操作系统下用CUDA8.0/CUDA9.0/CUDA9.1编译的版本。  \n",
    "注意，上面语句中的cuda90并不会执行安装CUDA的操作，需要提前自行安装。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#安装cpu版本\n",
    "#更新conda\n",
    "conda update conda\n",
    "#先安装mkl\n",
    "conda install mkl\n",
    "#安装faiss-cpu\n",
    "conda install faiss-cpu -c pytorch\n",
    "#测试安装是否成功\n",
    "python -c \"import faiss\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#安装gpu版本\n",
    "#确保已经安装了CUDA，否则会自动安装cup版本。\n",
    "conda install faiss-gpu -c pytorch # 默认 For CUDA8.0\n",
    "conda install faiss-gpu cuda90 -c pytorch # For CUDA9.0\n",
    "conda install faiss-gpu cuda91 -c pytorch # For CUDA9.1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "注意，上面语句中的cuda90/91并不会执行安装CUDA的操作，需要提前自行安装。\n",
    "\n",
    "##编译安装\n",
    "编译安装需要3个步骤：  \n",
    "1.编译C++文件；  \n",
    "2.编译Python界面；  \n",
    "3.编译GPU部分。  \n",
    "步骤1是必要的，步骤2和3相互独立，不存在相互依赖。  \n",
    "faiss通过一个Makefile文件编译，系统相关的配置文件包含在makefile.inc这个文件中，在下载的faiss安装文件中的example_makefiles文件夹下有实例文件，选择适合的操作系统，将其复制到faiss根目录下，并重命名为makefile.inc。文件中的部分参数需要手动修改。  \n",
    "###第一步：编译C++ faiss\n",
    "####BLAS/Lapack"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# ubuntu 16\n",
    "sudo apt-get install libopenblas-dev python-numpy python-dev\n",
    "# ubuntu 14\n",
    "sudo apt-get install libopenblas-dev liblapack3 python-numpy python-dev\n",
    "\n",
    "# 执行配置文件\n",
    "./configure\n",
    "#检查BLAS\n",
    "make misc/test_blas\n",
    "./misc/test_blas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "####建造faiss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "make\n",
    "make install"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###第二步 编译Python界面"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#安装swig\n",
    "sudo apt-get install swig  # ubuntu 16\n",
    "make py\n",
    "# 默认使用系统python2.7，如果想使用其他版本的python,需要在makefile.inc文件中修改PYTHONCFLAGS值为python安装路径。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "####测试faiss的python使用"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#编译只有在faiss/python文件夹下应该包含如下三个文件\n",
    "#faiss.py\n",
    "#swigfaiss.py  / swigfaiss_gpu.py\n",
    "#_swigfaiss.so / _swigfaiss_gpu.so\n",
    "\n",
    "#编译不报错并不意味着faiss可以正常使用，\n",
    "python -c \"import faiss\"\n",
    "#如果不能import，可能是faiss的路径没配置正确，可以在使用时添加代码\n",
    "import sys\n",
    "sys.path.append(faiss_path) # 如 ‘/home/faiss/python/’\n",
    "#可能是有一些symbols丢失了，使用下面的命令查看\n",
    "cd python\n",
    "ldd -r _swigfaiss.so\n",
    "# 有时候只有在使用BLAS库的时候报错，使用下面的命令测试\n",
    "python -c \"import faiss, numpy\"\n",
    "faiss.Kmeans(10, 20).train(numpy.random.rand(1000, 10).astype('float32'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###第三步 编译GPU部分  \n",
    "待完成。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
